2: COMMENT ⊗ VALID 00024 PAGES 3: RECORD PAGE DESCRIPTION 4: 00001 00001 5: 00004 00002 BEGIN IMPSER 6: 00005 00003 ERROR TYPEOUT ROUTINE. INCREMENTS APPROPRIATE ERROR COUNTER THEN 7: 00007 00004 OPCODE DEFINITIONS FOR SECOND LEVEL PROTOCAL 8: 00011 00005 PROTOCAL ERROR CODES 9: 00013 00006 COMMENT A BRIEF DESCRIPTION OF THE PROTOCAL 10: 00018 00007 MORE PROTOCAL DESCRIPTIONS 11: 00022 00008 BYTE POINTERS TO PARTS OF MESSAGE HEADER. 12: 00025 00009 SPECIAL BITS IN RH OF IOS 13: 00028 00010 ROUTINES TO MAKE AND RELEASE IMP DEVICE DATA BLOCKS 14: 00029 00011 CLOCK LEVEL ROUTINE. CALLED EVERY TICK. EXAMINES INPUT MESSAGES 15: 00032 00012 WE GET HERE IF THERE ARE MESSAGES WAITING ON THE INPUT LIST 16: 00034 00013 MESSAGE TYPE DISPATCHES - TRACE, FROM IMP, IMP GOING DOWN 17: 00036 00014 IMP DEAD CODE - RUN DOWN LINK TABLE AND WAKE UP ANY WAITERS 18: 00038 00015 INTERFACE TIMED OUT (SHUDDER!). BRING THE SYSTEM DOWN. 19: 00040 00016 BLOCKED LINK, LINK TABLE FULL, RFNM, AND NOP 20: 00042 00017 HOST OR DESTINATION IMP DEAD. MARK HOST DEAD AND GIVE EVERYBODY ERRORS. 21: 00045 00018 INCOMPLETE TRANSMISSION, ERROR WITH MESSAGE IDENTIFICATION 22: 00048 00019 UNKNOWN LINK AND NO DDB ERROR TYPEOUTS 23: 00049 00020 ROUTINE TO MAKE UP A POINTER INTO THE HOST TABLES 24: 00050 00021 ROUTINE TO UNBLOCK LINK ZERO AND WAKE UP ANYBODY WAITING FOR IT 25: 00052 00022 ROUTINE TO TRANSMIT ANY MESSAGES IN CLOCK WAIT ON LINK 0 26: 00054 00023 ROUTINE TO FLUSH ALL CLOCK-LEVEL OUTPUTS TO A PARTICULAR HOST 27: 00055 00024 UNBLOCKING ROUTINE FOR NON-ZERO LINK 28: 00057 ENDMK 29: ⊗; 31: BEGIN IMPSER 32: SUBTTL NETWORK CONTROL PROGRAM FOR THE INTERGALACTIC MESSAGE PROCESSOR - JAM SEPT '71 34: ; ERROR TYPEOUT ROUTINE. INCREMENTS APPROPRIATE ERROR COUNTER THEN 35: ; TYPES CTY MESSAGE. 36: 37: DEFINE TELCTR (CTR,MESS) < 38: AOS CTR 39: SKIPN IMPPMS ; DO WE PRINT TODAY? 40: JRST .+7 ; NO, SKIP OVER ERROR MESSAGE 41: PUSHJ P,DISDATE 42: PUSHJ P,DISERR 43: [ASCIZ / IMP - MESS NUMBER /] 44: DISARG DEC,CTR 45: [ASCIZ / 46: /] 47: -1 48: > 49: 50: DEFINE ERRCTR (CTR,MESS) < 51: AOS CTR 52: PUSHJ P,DISDATE 53: PUSHJ P,DISERR 54: [ASCIZ / IMP - MESS NUMBER /] 55: DISARG DEC,CTR 56: [ASCIZ / 57: /] 58: -1 59: > 60: 61: ; DATA BLOCK DEFINITIONS . . . 62: 63: TLINK←←0 ; XWD <NEXT MESSAGE>,<NEXT BLOCK THIS MESSAGE> 64: TWC←←1 ; DATA WORD COUNT 65: TLEN←←2 ; LENGTH OF DATA PORTION OF BLOCK 66: TBP←←3 ; INPUT BYTE POINTER 67: TDATA←←4 ; BEGINNING OF DATA AREA 68: TLNG←←50 ; LENGTH OF ENTIRE BLOCK 69: ↑TDLEN←←TLNG-TDATA 70: ; LENGTH OF DATA PORTION ONLY 71: 72: ; DEBUGGING MASKS 73: 74: LEADM←←741774007777 ; MASK FOR LEADER 75: SCM←←740077777400 ; MASK FOR SIZE AND COUNT FIELDS 77: ; OPCODE DEFINITIONS FOR SECOND LEVEL PROTOCAL 78: 79: NOP←←0 ; NO-OPERATION 80: RTS←←1 ; ESTABLISH CONNECTION, SENT FROM RECEIVER TO SENDER 81: ; FOLLOWED BY 32 BITS OF RECEIVE SOCKET, 82: ; 32 BITS OF SEND SOCKET, AND 8 BITS OF LINK NUMBER 83: STR←←2 ; ESTABLISH CONNECTION, SENT FROM SENDER TO RECEIVER 84: ; FOLLOWED BY 32 BITS OF SEND SOCKET, 85: ; 32 BITS OF RECEIVE SOCKET, AND 8 BITS OF BYTE SIZE. 86: CLS←←3 ; CLOSE CONNECTION. FOLLOWED BY 32 BITS LOCAL SOCKET 87: ; NUMBER AND 32 BITS FOREIGN SOCKET NUMBER 88: ALL←←4 ; ALLOCATE. SENT FROM RECEIVER TO SENDER TELLING HOW 89: ; MUCH DATA MAY BE SENT AT A TIME. FOLLOWED BY 90: ; 8 BITS OF LINK NUMBER, 16 BITS OF MESSAGE SPACE 91: ; AND 32 BITS OF BIT SPACE. 92: GVB←←5 ; GIVE BACK ALLOCATION. SENT FROM RECEIVER TO SENDER 93: ; TO REQUEST RETURN OF STORAGE. FOLLOWED BY 8 BITS 94: ; OF LINK NUMBER, 8 BITS OF A 7-FIXED-BINARY-PLACE 95: ; FRACTION WHICH IS THE FRACTION OF THE MESSAGE 96: ; SPACE TO BE RETURNED, AND 8 BITS OF FRACTION WHICH 97: ; IS THE FRACTION OF THE BIT SPACE TO BE RETURNED. 98: RET←←6 ; RETURN STORAGE. SENT FROM SENDER TO RECEIVER EITHER 99: ; SPONTANEOUSLY OR IN RESPONSE TO A GVB COMMAND. FOLLOWED 100: ; BY 8 BITS OF LINK, 16 BITS OF MESSAGE SPACE, AND 32 101: ; BITS OF BIT SPACE. 102: INR←←7 ; INTERRUPT BY RECEIVER. ASKS THE SENDER TO CEASE. 103: ; FOLLOWED BY 8 BITS OF LINK NUMBER. 104: INS←←10 ; INTERRUPT BY SENDER. TELLS RECEIVER TO INTERRUPT 105: ; RECEIVING PROCESS. A SPECIAL CHARACTER IS INCLUDED 106: ; IN THE TEXT STREAM TO MARK WHERE IN TIME THE INTERRUPT 107: ; IS TO OCCUR. FOLLOWED BY 8 BITS OF LINK NUMBER. 108: ECO←←11 ; ECHO TEST. FOLLOWED BY 8 BITS OF TEST DATA. RECEIVING 109: ; HOST IS TO RETURN SAID DATA VERBATUM VIA FOLLOWING COMMAND. 110: ERP←←12 ; ECHO REPLY. FOLLOWED BY 8 BITS OF RETURNED TEST DATA. 111: ERR←←13 ; ERROR. FOLLOWED BY 8 BITS OF ERROR CODE AND 112: ; 80 BITS OF ERROR DATA. 113: RST←←14 ; RESET. ASKS HOST TO CLEAR ALL TABLES AND CONNECTIONS 114: ; HAVING TO DO WITH US. 115: RRP←←15 ; RESET REPLY. INDICATES THE RESET HAS BEEN DONE. 117: ; PROTOCAL ERROR CODES 118: 119: ILO←←1 ; ILLEGAL OPCODE. AN ILLEGAL OPCODE WAS DETECTED IN 120: ; A CONTROL MESSAGE. THE "dATA" FIELD CONTAINS THE TEN BYTES OF 121: ; THE AILING CONTROL MESSAGE BEGINNING WITH THE BYTE CONTAINING 122: ; THE ILLEGAL OPCODE. 123: SPS←←2 ; SHORT PARAMETER SPACE. THE END OF A CONTROL MESSAGE 124: ; WAS ENCOUNTERED BEFORE ALL THE REQUIRED PARAMETERS OF 125: ; THE CONTROL COMMAND BEING DECODED WERE FOUND. THE "dATA" 126: ; FIELD CONTAINS THE COMMAND IN ERROR. 127: BDP←←3 ; BAD PARAMETERS. ERRONEOUS PARAMETERS WERE FOUND 128: ; IN A CONTROL COMMAND. DATA FIELD CONTAINS AILING COMMAND. 129: NES←←4 ; NON-EX SOCKET. A COMMAND OTHER THAN STR OR RTS WAS 130: ; RECEIVED FOR A CONNECTION FOR WHICH NO REQUEST FOR 131: ; CONNECTION HAS BEEN MADE. 132: LNC←←5 ; LINK NOT CONNECTED. CONTROL COMMAND CONTAINING 133: ; A LINK NUMBER FOR WHICH NO CONNECTION EXISTS. 134: 135: ; WHEN THE ERROR CODE IS ZERO, THE NEXT 8 BIT BYTE IS THE STANFORD 136: ; PECULIAR ERROR CODE, FOLLOWED BY 72 BITS OF THE AILING COMMAND 137: ; RETURNED. HERE ARE THE STANFORD ERROR CODES. 138: 139: CTO←←1 ; COUNTER OVERFLOW. EITHER MESSAGE SPACE EXCEEDED 140: ; OR BIT SPACE EXCEEDED BY THE LAST MESSAGE. THE 141: ; MESSAGE WAS DISCARDED. 142: ILB←←2 ; ILLEGAL BYTE SIZE FOR CONTROL MESSAGE. MESSAGE 143: ; WAS DISCARDED. 145: COMMENT ⊗ A BRIEF DESCRIPTION OF THE PROTOCAL 146: THE PROTOCAL IS IN ABOUT 3 LAYERS. THE FIRST LAYER IS 147: IMP-HOST PROTOCAL. THE IMP SENDS US EACH MESSAGE PREFACED BY A 32-BIT 148: LEADER WHICH LOOKS LIKE THIS: 149: 150: 0 1 2 3 4 7 8 15 16 23 151: ************************************************************** 152: * * * * * * * * 153: * 0 * FI * TRC * OCT * TYPE * HOST * LINK * 154: * * * * * * * * 155: ************************************************************** 156: 157: THE FI BIT MEANS THE MESSAGE IF FROM THE IMP TTY. THIS CAN BE 158: GENERATED USING THE CROSSPATCH MODE AND TYPING A MESSAGE TO STANFORD 159: FROM THE TTY. OUR SYSTEM IGNORES SUCH MESSAGES. THE TRC BIT MEANS 160: THIS MESSAGE IS FOR TRACING FOR TEST PURPOSES AND WAS ISSUED FROM BBN 161: OR NMC. WE IGNORE IT ALSO. WE IGNORE THE OCT BIT. THE TYPE FIELD IS A 162: 4-BIT OPCODE TELLING WHAT KIND OF MESSAGE THIS IS. ALL DATA MESSAGES 163: FROM FOREIGN HOSTS ARE TYPE 0 AND ARE CALLED "rEGULAR" MESSAGES. THE 164: OTHER TYPES ARE DESCRIBED IN BBN DOCUMENT 1822 "SPECIFICATIONS FOR 165: THE INTERCONNECTION OF A HOST AND AN IMP". I WILL BRIEFLY DESCRIBE 166: THEM HERE. 167: TYPES 1, 3, 6, 7, 8, AND 9 ARE ALL ERRORS OF DIFFERENT KINDS. 168: IT MEANS THE LAST MESSAGE YOU SENT OUT WAS FLUSHED. TYPE 1 IS ERROR 169: WITHOUT MESSAGE IDENTIFICATION. TYPE 3 IS BLOCKED LINK, WHICH IS 170: MEANS WE GOOFED. WHEN YOU SEND A MESSAGE OUT, THE LINK (IDENTIFIED BY 171: THE HOST-LINK NUMBER, 16 BITS) BECOMES BLOCKED UNTIL THE MESSAGE IS 172: EITHER FLUSHED OR DELIVERED TO THE DESTINATION COMPUTER. THE 173: DESTINATION IMP THEN RETURNS THE REQUEST FOR NEW MESSAGE, TYPE 5, 174: BACK TO THE SENDING HOST. IF WE SEND OUT A MESSAGE BEFORE THE RFNM 175: COMES BACK, WE GET A "bLOCKED LINK" ERROR, TYPE 3. TYPE 6 IS LINK 176: TABLE FULL. THIS MEANS WE SENT OUT SO MANY MESSAGES ON SO MANY 177: DIFFERENT LINKS THAT COMBINED WITH THE MESSAGES ALREADY IN THE IMP, 178: WE OVERFLOWED ITS TABLES. TYPE 7 MEANS THE DESTINATION COMPUTER OR 179: IMP IS DEAD, AS DETERMINED BY THE MESSAGE STAYING IN THE IMP SYSTEM 180: FOR 90 SECONDS. THE MESSAGE IS TIMES OUT AND FLUSHED. TYPE 8 IS ERROR 181: WITH MESSAGE IDENTIFICATION AND TYPE 9 IS INCOMPLETE TRANSMISSION. 182: THESE ARE VERY NEBULOUS ERRORS. IT GENERALLY MEANS YOU SENT A MESSAGE 183: LONGER THAN 8092 BITS, OR SENT AN ILLEGAL TYPE IN THE LEADER OR 184: SOMETHING. 185: TO SUMMARIZE, THE NORMAL SEQUENCE OF EVENTS IS THAT WE SEND 186: OUT A MESSAGE AND SOME TIME LATER GET A RFNM BACK. 188: MORE PROTOCAL DESCRIPTIONS 189: 190: THE SECOND LEVEL PROTOCAL GOES AS FOLLOWS. WHEN A CONNECTION 191: IS OPEN, THERE IS A UNIQUE HOST-LINK NUMBER ASSOCIATED WITH EACH 192: DIRECTION OF COMMUNICATION. MESSAGES GO BACK AND FORTH AS REGULAR 193: MESSAGES. OPENING AND CLOSING CONNECTIONS IS THE HARD PART. ALL 194: "cONTROL" MESSAGES, THAT IS MESSAGES REGARDING OPENING AND CLOSING 195: AND REGULATING CONNECTIONS THEMSELVES, GO ON LINK ZERO. MOST OF THESE 196: COMMANDS HAVE SOME IDENTIFYING FIELD THAT TELLS WHAT CONNECTION THEY 197: ARE TALKING ABOUT. OPENING AND CLOSING A CONNECTION (BEFORE THE 198: UNIQUE LINK NUMBER IS ASSIGNED) IS DONE WITH THE CODES STR, RTS, AND 199: CLS AND CARRY ALONG WHAT ARE CALLED SOCKET NUMBERS. THESE NUMBERS ARE 200: 32-BITS LONG. 201: TO ESTABLISH A CONNECTION, YOU NEED A FOREIGN SOCKET NUMBER 202: TO CONNECT TO. THERE IS DEFINED TO BE AT EACH SITE A LOGGER, 203: LISTENING TO SOCKET 1, WHICH RETURNS YOU A SOCKET NUMBER FOR YOU TO 204: CONNECT TO. TO OPEN A CONNECTION, YOU SEND A STR OR A RTS, DEPENDING 205: ON WHETHER YOU ARE SENDING OR RECEIVING. THESE OPERATIONS CARRY A 206: LOCAL SOCKET NUMBER AND A FOREIGN SOCKET NUMBER AND ONE ADDITIONAL 207: BYTE, WHICH IS A CONNECTION BYTE SIZE IF RTS AND A LINK NUMBER IF 208: STR. A CONNECTION IS OPEN WHEN STR AND RTS WITH MATCHING SOCKET 209: NUMBERS HAVE BEEN EXCHANGED. A CONNECTION IS HALF-DUPLEX. TO GET 210: TRANSMISSION BOTH WAYS, YOU NEED TO OPEN TWO CONNECTIONS. THE USUAL 211: WAY IS TO OPEN A CONNECTION ON THE SOCKET NUMBER YOU GET FROM THE 212: LOGGER AND ON THAT NUMBER PLUS ONE. 213: A CONNECTION MAY BE CHANGED IN AT LEAST TWO WAYS. THE 214: SIMPLEST IS THE RESET (RST). A HOST RECEIVING A RESET IS SUPPOSED TO 215: BREAK ALL CONNECTIONS TO THE HOST SENDING THE RESET. THE RECEIVING 216: HOST IS TO RETURN A RESET REPLY (RRP) AS WELL. 217: THE GRACEFUL WAY TO BREAK A CONNECTION IS TO SEND A CLOSE 218: (CLS) WITH THE PAIR OF SOCKET NUMBERS. THE HOST RECEIVING THE CLS IS 219: TO RETURN A CLS WITH THE SAME SOCKET NUMBERS IN IT AND CAUSE THE 220: CONNECTION TO BE BROKEN. THE CONNECTION IS NOT BROKEN UNTIL CLSS HAVE 221: BEEN EXCHANGED. 222: WHEN A CONNECTION IS OPEN, THE RECEIVER SENDS THE SENDER AN 223: ALLOCATE MESSAGE (ALL) TELLING THE SENDER HOW MUCH BUFFERING HE HAS 224: AVAILABLE. EVERY TIME THE SENDER SENDS A MESSAGE, HE DECREMENTS THIS 225: NUMBER. EACH TIME THE SENDER RECEIVES AN ALLOCATE OPERATION, HE ADDS 226: THE NEW ALLOCATION INTO THE CURRENT ALLOCATION. ⊗ 228: ; BYTE POINTERS TO PARTS OF MESSAGE HEADER. 229: ; ASSUMES POINTER TO FIRST BLOCK OF MESSAGE IN AC1 230: 231: IMPBP: POINT 1,TDATA(AC1),1 ; 'MESSAGE FROM IMP' BIT 232: TRACEP: POINT 1,TDATA(AC1),2 ; TRACE MESSAGE BIT. MEANS MESSAGE IS 233: ; BEING ROUTED AROUND THE NETWORK FOR 234: ; ROUTING AND TIMING MEASUREMENT. 235: OCTALP: POINT 1,TDATA(AC1),3 ; MEANS MESSAGE IS FROM IMP DDT AND 236: ; IS TEXT FOR OCTAL NUMBERS 237: TYPEP: POINT 4,TDATA(AC1),7 ; IMP MESSAGE TYPE POINTER. 238: SRCP: POINT 8,TDATA(AC1),15 ; HOST NUMBER POINTER 239: LINKP: POINT 8,TDATA(AC1),23 ; LINK NUMBER POINTER 240: ELINKP: POINT 16,TDATA(AC1),23 ; PICKS UP 16 BIT HOST AND LINK NUMBER 241: SIZEP: POINT 8,TDATA+1(AC1),11 ; GETS BYTE SIZE FIELD 242: COUNTP: POINT 16,TDATA+1(AC1),27 243: ; BYTE COUNT FIELD 244: 245: ; SPECIAL DEFINITIONS FOR 2ND LEVEL PROTOCAL 246: 247: OPCDP: POINT 8,TDATA+2(AC1),7 248: OLINKP: POINT 8,TDATA+2(AC1),15 249: SZLKP: POINT 8,TDATA+4(AC1),15 ; FOR STR, IS BYTE SIZE, FOR RTS, IS LINK NUMBER 250: SOK1AP: POINT 24,TDATA+2(AC1),31; POINTS TO FIRST PART OF FIRST SOCKET NUMBER FOR STR, RTS, AND CLS 251: SOK1BP: POINT 8,TDATA+3(AC1),7 ; POINTS TO SECOND PART OF FIRST SOCKET NUMBER 252: SOK2AP: POINT 24,TDATA+3(AC1),31; FIRST PART OF SECOND SOCKET NUMBER 253: SOK2BP: POINT 8,TDATA+4(AC1),7 ; SECOND PART OF SECOND SOCKET NUMBER 254: BYTE2P: POINT 8,TDATA+2(AC1),15 ; SECOND BYTE OF MESSAGE 255: BYTE3P: POINT 8,TDATA+2(AC1),23 ; THIRD BYTE OF MESSAGE 256: 257: ; POINTERS INTO TIMEOUT FIELDS. EACH FIELD IS NUMBER OF 2-SECOND UNITS 258: 259: CLSTP: POINT 6,TIMES(DDB),5 ; HOW LONG WE WILL WAIT FOR RETURN CLOSE 260: RFNMTP: POINT 6,TIMES(DDB),11 ; FOR RFNM ON ZERO OR NON-ZERO LINK 261: ALLTP: POINT 6,TIMES(DDB),17 ; FOR ALLOCATION 262: RFCTP: POINT 6,TIMES(DDB),23 ; FOR RETURN RFC 263: INPTP: POINT 6,TIMES(DDB),29 ; FOR INPUT 265: ; SPECIAL BITS IN RH OF IOS 266: 267: HDEAD←←002000 ; HOST DEAD 268: CTROV←←001000 ; HOST OVERFLOWED OUR ALLOCATION 269: RSET←←000400 ; HE SENT US A RESET 270: TMO←←000200 ; TIMEOUT ON WAIT STATE OCCURRED 271: BLOK←←000100 ; THIS LINK IS BLOCKED 272: 273: ; LH BITS 274: 275: DEFINE Z(SYM,VAL) <SYM←←VAL ↔ ANYW←←ANYW!VAL> 276: 277: ANYW←←0 278: Z(INPW,200000) ; INPUT WAIT 279: Z(LNK0W,100000) ; CONTROL LINK WAIT 280: Z(BLOKW,040000) ; WAITING FOR LINK TO BECOME UNBLOCKED 281: Z(ALLW,020000) ; ALLOCATION WAIT 282: Z(TIMEW,010000) ; TIMEOUT WAIT 283: Z(RFCW,004000) ; WAIT FOR REQUEST FOR CONNECTION - LISTENING OR CONNECTION REQUESTED 284: Z(CLSW,002000) ; CLOSE WAIT. ONE CLOSE HAS BEEN SENT 285: 286: ; BITS IN LH OF STATE WORD IN IMPSTB 287: 288: ANYC←←400000 ; ANY CHANGE OF STATE 289: RFCS←←200000 ; RFC HAS BEEN SENT 290: RFCR←←100000 ; RFC HAS BEEN RECEIVED 291: CLSS←←040000 ; CLS SENT 292: CLSR←←020000 ; CLS RECEIVED 293: LONCE←←010000 ; HCLSS HAS BEEN HERE ONCE 294: 295: ; OTHER PARAMETERS . . . 296: 297: MAXCNT←←2*=60*=60 ; THIS IS HOW LONG WE WILL WAIT FOR THE IMP TO GOBBLE 298: ; OUR OUTPUT 299: MAXMAL←←2000/TLNG ; MAXIMUM MESSAGE ALLOCATION FOR FOREIGNERS 300: MAXBAL←←40*2000 ; MAXINAL BIT ALLOCATION 301: MINMAL←←2 ; MINIMUM MESSAGE ALLOCATION 302: MINBAL←←=36*4 ; MINIMUM BIT ALLOCATION 303: DEFMAL←←TDLEN ; DEFAULT MESSAGE ALLOCATION 304: DEFBAL←←44*TDLEN ; DEFAULT BIT ALLOCATION 305: 306: ; TABLE OF BITS PER WORD FOR DIFFERENT CONNECTION BYTE SIZES 307: ; -1 MEANS THIS BYTE SIZE NOT ALLOWED. 308: 309: BPW: 44 ↔ 44 ↔ 44 ↔ 44 ↔ 44 ↔ -1 ↔ 44 ↔ 44 310: 40 ↔ 44 ↔ -1 ↔ -1 ↔ 44 ↔ -1 ↔ -1 ↔ -1 311: 40 ↔ -1 ↔ 44 ↔ -1 ↔ -1 ↔ -1 ↔ -1 ↔ -1 312: -1 ↔ -1 ↔ -1 ↔ -1 ↔ -1 ↔ -1 ↔ -1 ↔ -1 313: 40 ↔ -1 ↔ -1 ↔ -1 ↔ 44 315: ; ROUTINES TO MAKE AND RELEASE IMP DEVICE DATA BLOCKS 316: 317: ↑IMPSET: 318: MOVEI AC3,IMPDLN 319: PUSHJ P,FSGET 320: JRST IMPDD1 321: HRRI DDB,1(AC1) 322: HRLI AC1,DDBMDL-1 323: BLT AC1,TIM(DDB) 324: HRLM DDB,DDBMDL+DEVSER 325: SETZM DDBMDL+DEVLOG 326: POPJ P, 327: 328: IMPDD1: SUB P,[XWD 3,3] 329: JRST DLYCM1 330: 331: ↑IMPCLR: 332: SETZB IOS,DEVIOS(DDB) 333: MOVEI AC1,DDBMDL 334: IMPCL1: MOVE TAC1,AC1 335: HLRZ AC1,DEVSER(TAC1) 336: JUMPE AC1,CPOPJ 337: CAIE AC1,(DDB) 338: JRST IMPCL1 339: MOVE DDB,DEVSER(AC1) 340: HLLM DDB,DEVSER(TAC1) 341: SOJA AC1,FSGIVE 343: ; CLOCK LEVEL ROUTINE. CALLED EVERY TICK. EXAMINES INPUT MESSAGES 344: 345: ↑IMPCLK: 346: MOVEM P,IMPFP 347: SKIPE IMPCLW ; WAITING FOR FREE STORAGE? 348: JRST CLKWT ; YES, DO NOTHING ELSE FOR A WHILE 349: SKIPE ILIST ; ANY INCOMMING MESSAGES? 350: JRST IMPMES ; YES, GO PROCESS THEM 351: SOSG IMPOCT ; HOW LONG HAVE WE BEEN WAITING FOR OUTPUT TO FINISH? 352: PUSHJ P,IMPTMO ; TOO DAMN LONG. GO SEE ABOUT IT 353: SKIPE RECOVER ; HAS ERROR RECOVERY SYSTEM BEEN INVOKED? 354: PUSHJ P,ERRREC ; YES, GO KEEP ON RECOVERING. 355: SOSGE POLCNT ; TIME TO POLL YET? 356: PUSHJ P,POLL ; YES, DO IT NOW 357: SKIPE TIMWAIT ; ANYONE WAITING FOR A TIMEOUT? 358: SOSLE TIMCNT ; YES, IS IT TIME TO CHECK? 359: POPJ P, 360: MOVEI AC1,2*JIFSEC ; YES, WAIT FOR ANOTHER SECOND 361: MOVEM AC1,TIMCNT ; RESET COUNTDOWN 362: SKIPN AC3,FFLNK ; ANYONE TO CHECK? 363: POPJ P, ; NO, DON'T BOTHER 364: TIMCHL: SKIPE DDB,IMPDDB-1(AC3) ; ANYONE HOME? 365: SKIPGE AC1,TIM(DDB) ; YES, IS HE WAITING FOR US? 366: JRST TIMCHI ; NO TO EITHER OR BOTH 367: SUB AC1,TIME ; GET DIFFERENCE BETWEEN CRITICAL TIME AND RIGHT NOW 368: JUMPL AC1,TIMN ; DIFFERENT ROUTINE FOR NEGATIVE DIFFERENCE 369: CAML AC1,[=12*=60*JIFMIN] 370: SUB AC1,JIFDAY ; WRAP IT BACK AROUND TO GET A SMALL NUMBER 371: JRST TIMC ; NOW CHECK IT 372: 373: TIMN: CAMGE AC1,[-=12*=60*JIFMIN] 374: ADD AC1,JIFDAY 375: TIMC: JUMPG AC1,TIMCHI ; IF DIFFERENCE IS POSITIVE, HASN'T EXPIRED YET 376: MOVEI IOS,TMO ; NOTE THAT A TIMEOUT HAS HAPPENED 377: ORM IOS,DEVIOS(DDB) 378: PUSHJ P,QRUN 379: SKIPLE TIMWAIT ; ANYONE ELSE? 380: TIMCHI: SOJG AC3,TIMCHL ; YES, GO BACK FOR MORE 381: POPJ P, 383: ; WE GET HERE IF THERE ARE MESSAGES WAITING ON THE INPUT LIST 384: 385: IMPMES: HRRZ AC1,ILIST ; YES, PICK UP ADDRESS OF FIRST MESSAGE 386: PUSHJ P,LEGAL ; IS THIS A REASONABLE BLOCK 387: JRST [ SETZM ILIST ; NO, FLUSH THE LIST 388: JRST IMPCLK] 389: LDB AC2,IMPBP ; SEE IF IT IS FROM THE IMP 390: JUMPN AC2,FRIMP ; YES, DISCARD. 391: LDB AC2,TRACEP ; IS IT A TRACE MESSAGE 392: JUMPN AC2,TRCMES ; YES, DISCARD IT. 393: LDB AC2,TYPEP ; PICK UP MESSAGE TYPE 394: CAIGE AC2,MAXMT ; IS IT LEGAL? 395: JRST @MTDSP(AC2) ; YES, DISPATCH TO IT 396: TELCTR(ILLMT,<ILLEGAL MESSAGE TYPE>) 397: PSCAN: PUSHJ P,POPMESS ; TAKE MESSAGE OFF LIST AND RELEASE STORAGE 398: JRST IMPCLK 399: 400: ; DISPATCH TABLE FOR MESSAGE TYPES 401: 402: MTDSP: REGULAR ; REGULAR MESSAGE. ALL DATA AND CONTROL COME THROUGH HERE. 403: EWOMI ; ERROR WITHOUT MESSAGE IDENTIFICATION 404: IMPGD ; IMP GOING DOWN 405: BLKLNK ; BLOCKED LINK - WE GOOFED! 406: NOPCN ; NO OPERATION. 407: RFNM ; REQUEST FOR NEW MESSAGE, UNBLOCK LINK 408: LTABF ; LINK TABLE FULL - HORRIBLE IMP ERROR! 409: DDEAD ; HOST OR DESTINATION IMP DEAD 410: EWMI ; ERROR WITH MESSAGE IDENTIFICATION 411: INCT ; INCOMPLETE TRANSMISSION 412: MAXMT←←.-MTDSP 414: ; MESSAGE TYPE DISPATCHES - TRACE, FROM IMP, IMP GOING DOWN 415: ; TRACE MESSAGE. LOG THEN DISCARD. 416: 417: TRCMES: AOSA TRACES 418: FRIMP: AOS FRMIMP 419: JRST PSCAN 420: 421: EWOMI: TELCTR(ERWOMI,<ERROR WITHOUT MESSAGE IDENTIFICATION>) 422: SKIPN RECOVER 423: SETOM RECOVER 424: JRST PSCAN 425: 426: IMPGD: AOS NIMPDN 427: PUSHJ P,IMPDD ; BRING DOWN IMP SYSTEM 428: JRST IMPCLK ; GO THROUGH THE LOOP AGAIN 429: 430: IMPDD: SETOM IMPDEAD ; SHUT DOWN THE IMP 431: HRLOI AC1,377777 432: MOVEM AC1,IMPOCT 433: CONO IMP,ODPIEN!IDPIEN!IEPIEN 434: SETZM IMPECT ; SET ERROR COUNT TO ZERO 435: PUSHJ P,DISDATE 436: PUSHJ P,DISERR 437: [ASCIZ / THE IMP IS DEAD! 438: LONG LIVE THE IMP! 439: /] 440: -1 441: SKIPE AC1,ILIST ; NOW WE HAVE TO GIVE BACK ALL THE BUSINESS IN PROGRESS 442: PUSHJ P,RELBLS 443: SETZM ILIST 444: SKIPE AC1,OLIST ; OUTPUT LIST TOO 445: PUSHJ P,RELBLS 446: SETZM OLIST 447: SKIPE AC1,L0CWTL 448: PUSHJ P,RELBLS 449: SETZM L0CWTL 451: ; IMP DEAD CODE - RUN DOWN LINK TABLE AND WAKE UP ANY WAITERS 452: 453: SKIPN AC3,FFLNK ; NOW SEE IF THERE ARE ANY QUEUED RFC'S TO BE RELEASED 454: JRST IMPDD4 455: IMPLLP: SKIPE AC1,IMPRFQ-1(AC3) ; IS THERE ANOTHER RFC LIST 456: PUSHJ P,RELBLS 457: SETZM IMPRFQ-1(AC3) 458: SKIPN DDB,IMPDDB-1(AC3) 459: JRST IMPDDI 460: MOVE IOS,DEVIOS(DDB) 461: ORI IOS,HDEAD!IODTER 462: ANDCMI IOS,BLOK 463: TLZE IOS,ANYW ; BRING THIS GUY OUT OF WAIT STATE 464: PUSHJ P,QRUN 465: MOVEM IOS,DEVIOS(DDB) 466: IMPDDI: SOJG AC3,IMPLLP 467: IMPDD4: SKIPE AC1,IMPITOP ; GIVE BACK ANY PARTIALLY IMPUTTED MESSAGE 468: PUSHJ P,RELLST 469: SETZM IMPITOP 470: SKIPE AC1,IMPSPARE ; GIVE BACK ANY SPARE BLOCKS WHAT MAY BE 471: PUSHJ P,IMPREL 472: SETZM IMPSPARE 473: SKIPN AC1,IMPFSL 474: JRST IMPDD6 ; IF NO SPARE LIST, FORGET IT 475: IMPFDL: PUSH P,(AC1) ; SAVE ADDRESS OF NEXT BLOCK 476: PUSHJ P,FSGIVE 477: POP P,AC1 478: JUMPN AC1,IMPFDL 479: SETZM IMPFSL 480: IMPDD6: POPJ P, 482: ; INTERFACE TIMED OUT (SHUDDER!). BRING THE SYSTEM DOWN. 483: 484: IMPTMO: ERRCTR(OPTMO,<INTERFACE TIMED OUT>) 485: MOVE AC1,OPTMO 486: CAIL AC1,10 487: JRST IMPDD ; IF TOO MANY TIMEOUTS, BRING DOWN THE IMP 488: SKIPLE NOPCNT 489: JRST IMPTM3 490: SKIPE AC1,IMPOCUR ; PICK UP CURRENT OUTPUT BLOCK 491: PUSHJ P,RELLST ; GIVE BACK THE REST OF IT 492: SETOM RECOVER 493: SKIPN AC1,OLIST 494: JRST IMPTM2 495: HLRZ AC2,TLINK(AC1) ; GET LINK TO NEXT OUTPUT REQUEST 496: HRRM AC2,OLIST ; MAKE IT NEW CURRENT REQUEST 497: SKIPN AC2 498: SETZM OLIST 499: HRRZS AC1 500: CONO IMP,FINO ; MAKE SURE INTERFACE THINKS WE ARE DONE 501: MOVEI AC3,200 502: IMPTM1: CONSO IMP,ODONE 503: SOJG AC3,IMPTM1 504: JRST QIDLE ; TRY TO START THE NEXT TRANSFER 505: 506: IMPTM2: SETZM IMPOACT 507: HRLOI AC1,377777 508: MOVEM AC1,IMPOCT 509: POPJ P, 510: 511: IMPTM3: SETOM RECOVER 512: CONO PI,IMPOFF 513: CONO IMP,FINO ;TRY TO UNHANG OUTPUT IF POSSIBLE 514: MOVEI AC3,200 515: CONSO IMP,ODONE 516: SOJG AC3,.-1 517: JRST SNDNOP ;WILL DO CONO PI,IMPON 519: ; BLOCKED LINK, LINK TABLE FULL, RFNM, AND NOP 520: 521: BLKLNK: SKIPE RECOVER 522: JRST PSCAN 523: SETOM RECOVER 524: TELCTR(NBLNKS,<BLOCKED LINK>) 525: JRST STERB 526: 527: LTABF: TELCTR(LTFULL,<LINK TABLE FULL!!?!?!>) 528: JRST STERB 529: 530: ; REQUEST FOR NEW MESSAGE. UNBLOCK LINK AND WAKE UP ANY WAITERS. 531: 532: RFNM: LDB AC2,ELINKP ; PICK UP HOST-LINK NUMBER 533: TRNN AC2,177400 ; HOST ZERO? 534: JRST HOST0 ; YES, NO SUCH HOST 535: TRNN AC2,377 ; LINK 0? 536: JRST L0RFNM ; YES, UNBLOCK IT SEPARATELY 537: PUSHJ P,FNDLNK ; NO, SEARCH LINK TABLE FOR IT 538: JRST UNL ; NOT THERE, SEND BACK UNKNOWN LINK ERROR 539: SKIPE DDB,IMPDDB-1(AC3) ; LINK THERE, DOES IT HAVE A DDB? 540: PUSHJ P,UNBLOK ; YES, UNBLOK IT AND RESUME ANY RELEVANT PROCESS 541: JRST PSCAN ; IF NO DDB, PROCESS MIGHT HAVE BEEN RESET, SO DON'T WORRY ABOUT IT 542: 543: L0RFNM: PUSHJ P,UNBL0 ; UNBLOCK LINK 0 AND SEND ANY WAITING CONTROL MESSAGES 544: JRST PSCAN 545: 546: HOST0: AOS NHOST0 547: JRST PSCAN 548: 549: ; NO-OPERATION. LOG AND LEAVE. 550: 551: NOPCN: AOS FLNOPS ; NUMBER OF FIRST-LEVEL NO-OPS 552: JRST PSCAN 554: ; HOST OR DESTINATION IMP DEAD. MARK HOST DEAD AND GIVE EVERYBODY ERRORS. 555: ; WAKE ANYBODY UP WAITING FOR US. FLUSH WAITING CLOCK LEVEL CONTROL MESSAGES. 556: 557: DDEAD: PUSHJ P,FLCWL0 ; FLUSH WAITING CONTROL MESSAGES 558: LDB AC2,ELINKP ; PICK UP HOST-LINK NUMBER 559: ANDCMI AC2,377 ; CLEAR LINK NUMBER 560: SKIPN AC3,FFLNK ; PICK UP NUMBER OF FIRST FREE ENTRY IN LINK TABLE 561: JRST MRKD ; NONE THERE, MARK HOST DEAD AND LEAVE 562: DDL: MOVEI TAC,(AC2) ; SAVE COPY OF HOST NUMBER 563: XOR TAC,LNKTAB-1(AC3) ; COMPARE IT WITH HOST NUMBER IN LINK TABLE 564: TRNN TAC,177400 ; DO HOST NUMBERS MATCH? 565: JRST DDGOT ; YES, WAKE HIM UP IF NECESSARY 566: DDLINC: SOJG AC3,DDL ; LOOP AROUND FOR NEXT LINK TABLE ENTRY 567: MRKD: LDB TEM,LINKP ; PICK UP LINK NUMBER 568: JUMPN TEM,PSCAN 569: PUSHJ P,L0PTR ; PICK UP POINTER INTO HOST TABLES 570: ANDCAM AC3,L0BLOK(AC2) ; CLEAR LINK 571: JRST PSCAN 572: 573: ; COME HERE WITH DDB OF AN ACTIVE CONNECTION TO SEE IF IT SHOULD 574: ; BE AWAKENED. 575: 576: DDGOT: MOVE TEM,IMPSTB-1(AC3) ; PICK UP THIS HOLE'S STATUS BITS 577: TLNE TEM,RFCR!RFCS ; ANY CONNECTION HERE? 578: SKIPN DDB,IMPDDB-1(AC3) ; IS THERE A DDB? 579: JRST DDLINC ; NO, LOOP AROUND 580: MOVE IOS,DEVIOS(DDB) ; YES, PICK UP STATUS WORD 581: TLNE IOS,LNK0W ; WAITING FOR LINK 0? 582: SOS L0WAIT ; YES, DECREMENT COUNT OF PEOPLE WAITING FOR LINK 0 583: ORI IOS,HDEAD!IODTER 584: ANDCMI IOS,BLOK ; UNBLOCK LINK 585: TLZE IOS,ANYW ; ANY WAIT STATE? 586: PUSHJ P,QRUN ; YES, REQUE TO RUN STATE. 587: MOVEM IOS,DEVIOS(DDB) ; RESTORE STATUS WORD 588: JRST DDLINC ; GO LOOK AT NEXT ONE 590: ; INCOMPLETE TRANSMISSION, ERROR WITH MESSAGE IDENTIFICATION 591: 592: INCT: AOSA INCMTR 593: EWMI: AOS ERWMI 594: STERB: LDB AC2,ELINKP ; PICK UP HOST-LINK NUMBER 595: TRNN AC2,177400 596: JRST HOST0 ; NO HOST ZERO 597: TRNN AC2,377 ; LINK 0? 598: JRST L0EWMI ; YES, CLEAR IT SEPARATELY 599: PUSHJ P,FNDLNK ; NO, LOCATE POSITION IN LINK TABLE 600: JRST PSCAN ; UNKNOWN LINK. DO NOT SEND ERROR MESSAGE! 601: SKIPN DDB,IMPDDB-1(AC3) ; IS THERE A DDB THERE? 602: JRST NODDB ; NO 603: PUSHJ P,UNBLOK ; YES, PICK UP IOS AND UNBLOCK LINK 604: ORI IOS,IODERR 605: MOVEM IOS,DEVIOS(DDB) ; NOTE THAT AN ERROR HAS HAPPENED AND THAT WE MIGHT RECEIVE A RFNM LATER 606: JRST PSCAN 607: 608: L0EWMI: PUSHJ P,CLRBL0 ; UNBLOCK LINK 609: PUSHJ P,CWL0 ; WAKE UP ANYBODY WAITING FOR LINK 0 610: JFCL 611: SKIPE L0WAIT ; IS THERE ANYBODY AT USER-LEVEL WAITING? 612: SKIPN AC3,FFLNK ; YES, IS THERE A LINK TABLE TO SEARCH 613: JRST PSCAN ; NO, FLUSH TRANSFER AND LEAVE 614: LDB AC2,ELINKP ; PICK UP HOST-LINK NUMBER 615: L0EWL: MOVEI TAC,(AC2) ; SAVE HOST-LINK NUMBER 616: XOR TAC,LNKTAB-1(AC3) ; COMPARE IT WITH TABLE 617: TRNN TAC,177400 ; DO HOST NUMBERS MATCH? 618: JRST L0MRKE ; YES 619: L0EWIN: SOJG AC3,L0EWL ; NO, LOOP AROUND 620: JRST PSCAN 621: 622: L0MRKE: MOVE TEM,IMPSTB-1(AC3) 623: TLNE TEM,RFCR!RFCS 624: SKIPN DDB,IMPDDB-1(AC3) ; PICK UP DEVICE DATA BLOCK ADDRESS 625: JRST L0EWIN ; NONE THERE, LOOP AROUND 626: MOVE IOS,DEVIOS(DDB) 627: TLZN IOS,LNK0W ; WAITING FOR LINK 0? 628: JRST L0EWIN ; NO, FORGET IT 629: PUSHJ P,QRUN ; YES, PUT HIM IN RUN QUEUE 630: ORI IOS,IODERR ; AND GIVE HIM ERROR MESSAGE 631: MOVEM IOS,DEVIOS(DDB) 632: SKIPE L0WAIT ; ARE THERE ANY MORE WAITERS? 633: JRST L0EWIN ; YES, GO LOOK FOR THEM 634: JRST PSCAN 636: ; UNKNOWN LINK AND NO DDB ERROR TYPEOUTS 637: 638: UNL: TELCTR(UNKLNK,<UNKNOWN LINK>) 639: PUSHJ P,UNLMER 640: JRST PSCAN 641: 642: UNLMER: PUSH P,AC1 ; SAVE INPUT MESSAGE ADDRESS 643: PUSHJ P,MAKERB ; MAKE UP AN ERROR BLOCK 644: PUSHJ P,CLKWAIT ; IF NONE, WAIT FOR IT (SIGH) 645: PUSHJ P,EFILL ; SEND HIM BACK HIS COMMAND 646: MOVEI AC3,LNC ; GIVE HIM LINK-NOT-CONNECTED ERROR 647: DPB AC3,BYTE2P 648: PUSHJ P,CLKOUT ; SEND IT OUT 649: POP P,AC1 ; GET BACK HIS MESSAGE 650: POPJ P, 651: 652: NODDB: TELCTR(NODDBS,<NO DDB>) 653: JRST PSCAN 655: ; ROUTINE TO MAKE UP A POINTER INTO THE HOST TABLES 656: ; CALL WITH POINTER TO INCOMMING MESSAGE IN AC1 657: ; RETURNS INDEX IN AC2 AND SINGLE BIT IN AC3 658: 659: L0PTR: LDB AC2,[POINT 5,TDATA(AC1),15] 660: MOVEI AC3,1 661: LSH AC3,(AC2) 662: LDB AC2,[POINT 3,TDATA(AC1),10] 663: POPJ P, 664: 665: ; ROUTINE TO UNBLOCK LINK ZERO 666: ; CALL WITH POINTER TO INCOMMING MESSAGE IN AC1 667: 668: CLRBL0: PUSHJ P,L0PTR 669: TDNN AC3,L0BLOK(AC2) ; FIRST, IS IT BLOCKED? 670: JRST ILLUNB 671: ANDCAM AC3,L0BLOK(AC2) ; YES, CLEAR IT 672: POPJ P, 674: ; ROUTINE TO UNBLOCK LINK ZERO AND WAKE UP ANYBODY WAITING FOR IT 675: 676: UNBL0: PUSHJ P,CLRBL0 ; CLEAR BLOCK ON LINK ZERO 677: PUSHJ P,CWL0 ; WAKE UP ANY CLOCK LEVEL WAITERS 678: SKIPN L0WAIT ; ANY UUO LEVEL WAITERS? 679: POPJ P, ; LEAVE IF A CLOCK LEVEL WAITER WAS AWOKEN OR IF NO UUO WAITERS 680: SKIPN AC3,FFLNK ; SCAN LINK TABLE 681: JRST NOLNKS ; NONE THERE, ERROR 682: LDB AC2,ELINKP ; PICK UP HOST-LINK NUMBER 683: L0FL: MOVE TAC,AC2 684: XOR TAC,LNKTAB-1(AC3) 685: TRNN TAC,177400 ; HOST NUMBERS MATCH? 686: JRST L0TRY ; YES, SEE IF HE IS WAITING FOR LINK 0 687: L0INCR: SOJG AC3,L0FL 688: POPJ P, 689: 690: L0TRY: SKIPN DDB,IMPDDB-1(AC3) 691: JRST L0INCR 692: MOVE IOS,DEVIOS(DDB) 693: TLZN IOS,LNK0W 694: JRST L0INCR 695: SOS L0WAIT ; NOTE ONE LESS UUO-LEVEL WAITER 696: PUSHJ P,QRUN 697: MOVEM IOS,DEVIOS(DDB) 698: SKIPE L0WAIT 699: JRST L0INCR 700: POPJ P, 701: 702: NOLNKS: TELCTR(NRFNL,<RFNM WITH NO LINK>) 703: POPJ P, 705: ; ROUTINE TO TRANSMIT ANY MESSAGES IN CLOCK WAIT ON LINK 0 706: ; CALL WITH INCOMMING MESSAGE CAUSING UNBLOCKING IN AC1 707: ; SKIPS IF ANY WAITING MESSAGES WERE FOUND 708: 709: CWL0: SETZ TAC1, ; NOTE NO PREVIOUS WAITER 710: LDB AC3,SRCP ; PICK UP HOST NUMBER 711: SKIPN AC2,L0CWTL ; PICK UP WAIT LIST 712: POPJ P, ; NONE THERE 713: CWL0A: LDB TAC,[POINT 8,TDATA(AC2),15] 714: CAMN TAC,AC3 ; SAME HOST? 715: JRST CWL0G ; YES, SERVE HIM 716: MOVE TAC1,AC2 ; PUT THIS BLOCK IN LAST BLOCK POSITION 717: HLRZ AC2,TLINK(AC2) ; PICK UP NEXT BLOCK ADDRESS 718: JUMPN AC2,CWL0A ; IF THERE IS ONE, LOOP AROUND AND SERVE IT 719: POPJ P, 720: 721: CWL0G: PUSHJ P,UNLCW ; UNLINK IT 722: PUSH P,AC1 723: MOVE AC1,AC2 724: PUSHJ P,QOUT ; SEND IT OUT 725: POP P,AC1 726: PUSHJ P,L0PTR 727: ORM AC3,L0BLOK(AC2) ; NOTE LINK 0 BLOCKED 728: JRST CPOPJ1 ; GIVE SKIP RETURN 729: 730: ; ROUTINE TO UNLINK A BLOCK FROM THE CLOCK WAIT LIST 731: ; CALL WITH BLOCK ADDRESS IN AC2 AND ACCRESS OF PREVIOUS BLOCK IN TAC1 732: 733: UNLCW: JUMPN TAC1,CWL0NN 734: HLRZ AC3,TLINK(AC2) ; PICK UP ADDRESS OF NEXT BLOCK 735: HRRM AC3,L0CWTL 736: SKIPN AC3 737: SETZM L0CWTL 738: POPJ P, 739: 740: CWL0NN: HLRZ AC3,TLINK(AC2) 741: HRLM AC3,TLINK(TAC1) 742: SKIPN AC3 743: HRLM TAC1,L0CWTL 744: POPJ P, 746: ; ROUTINE TO FLUSH ALL CLOCK-LEVEL OUTPUTS TO A PARTICULAR HOST 747: ; CALL WITH INCOMMING MESSAGE IN AC1 748: 749: FLCWL0: SETZ TAC1, 750: LDB AC3,SRCP 751: SKIPN AC2,L0CWTL 752: POPJ P, 753: FLCWA: LDB TAC,[POINT 8,TDATA(AC2),15] 754: CAMN TAC,AC3 755: JRST FLCG 756: MOVE TAC1,AC2 757: HLRZ AC2,TLINK(AC2) 758: JUMPN AC2,FLCWA 759: POPJ P, 760: 761: FLCG: HLRZ DAT,TLINK(AC2) 762: PUSH P,AC3 ; SAVE STATE OF SCAN 763: PUSH P,DAT 764: PUSH P,AC1 765: PUSH P,TAC1 766: PUSHJ P,UNLCW ; UNLINK LIST FROM WAIT LIST 767: MOVE AC1,AC2 768: PUSHJ P,RELLST ; RELEASE STORAGE IN LIST 769: POP P,TAC1 770: POP P,AC1 771: POP P,AC2 772: POP P,AC3 773: JUMPN AC2,FLCWA 774: POPJ P, 776: ; UNBLOCKING ROUTINE FOR NON-ZERO LINK 777: ; DDB MUST BE SET UP 778: 779: UNBLOK: MOVE IOS,DEVIOS(DDB) 780: TRZN IOS,BLOK ; IS IT BLOCKED? 781: JRST ILLUNB 782: TLZE IOS,BLOKW ; IS HE WAITING FOR IT TO BECOME UNBLOCKED? 783: PUSHJ P,QRUN ; YES, WAKE HIM UP 784: UNBLK1: MOVEM IOS,DEVIOS(DDB) 785: POPJ P, 786: 787: ILLUNB: PUSH P,DDB 788: SKIPN RECOVER 789: SETOM RECOVER 790: TELCTR(BDRFNM,<UNBLOCKING AN ALREADY UNBLOCKED LINE>) 791: POP P,DDB 792: POPJ P, 793: 794: ; ROUTINE TO FIND THE INDEX OF A GIVEN HOST-LINK NUMBER 795: ; FINDS SEND-SIDE INDEX ONLY 796: ; ENTER WITH HOST-LINK NUMBER IN AC2 797: ; RETURNS INDEX INTO LNKTAB AND IMPDDB IN AC3 798: ; SKIPS ON SUCCESS 799: 800: FNDLNK: SKIPN AC3,FFLNK ; PICK UP NUMBER OF FIRST FREE LINK 801: POPJ P, 802: FNDL1: CAMN AC2,LNKTAB-1(AC3) ; IS THIS IT? 803: JRST FNDL2 ; YES, CHECK FOR SEND-SIDE 804: FNDL3: SOJG AC3,FNDL1 805: POPJ P, 806: 807: FNDL2: MOVE TEM,IMPLS-1(AC3) 808: TRNN TEM,1 809: JRST FNDL3 810: JRST CPOPJ1